﻿using System;
using System.Data;

namespace PublicDomain.Data.Csv
{
    public static class DataRecordGetSafeColumnValue
    {
        public static bool GetSafeBoolean(this IDataReader dataReader, int i, bool dbNullDefault = false)
        {
            if (dataReader == null)
            {
                throw new ArgumentNullException("dataReader");
            }

            if (dataReader.IsDBNull(i))
            {
                return dbNullDefault;
            }

            return dataReader.GetBoolean(i);
        }

        public static bool? GetSafeNullableBoolean(this IDataReader dataReader, int i, bool? dbNullDefault = null)
        {
            if (dataReader == null)
            {
                throw new ArgumentNullException("dataReader");
            }

            if (dataReader.IsDBNull(i))
            {
                return dbNullDefault;
            }

            return new bool?(dataReader.GetBoolean(i));
        }

        public static byte GetSafeByte(this IDataReader dataReader, int i, byte dbNullDefault = default(byte))
        {
            if (dataReader == null)
            {
                throw new ArgumentNullException("dataReader");
            }

            if (dataReader.IsDBNull(i))
            {
                return dbNullDefault;
            }

            return dataReader.GetByte(i);
        }

        public static byte? GetSafeNullableByte(this IDataReader dataReader, int i, byte? dbNullDefault = null)
        {
            if (dataReader == null)
            {
                throw new ArgumentNullException("dataReader");
            }

            if (dataReader.IsDBNull(i))
            {
                return dbNullDefault;
            }

            return new byte?(dataReader.GetByte(i));
        }

        //// public long GetBytes

        public static char GetSafeChar(this IDataReader dataReader, int i, char dbNullDefault = default(char))
        {
            if (dataReader == null)
            {
                throw new ArgumentNullException("dataReader");
            }

            if (dataReader.IsDBNull(i))
            {
                return dbNullDefault;
            }

            return dataReader.GetChar(i);
        }

        public static char? GetSafeNullableChar(this IDataReader dataReader, int i, char? dbNullDefault = null)
        {
            if (dataReader == null)
            {
                throw new ArgumentNullException("dataReader");
            }

            if (dataReader.IsDBNull(i))
            {
                return dbNullDefault;
            }

            return new char?(dataReader.GetChar(i));
        }

        //// public long GetChars

        public static DateTime GetSafeDateTime(this IDataReader dataReader, int i, DateTime dbNullDefault = default(DateTime))
        {
            if (dataReader == null)
            {
                throw new ArgumentNullException("dataReader");
            }

            if (dataReader.IsDBNull(i))
            {
                return dbNullDefault;
            }

            return dataReader.GetDateTime(i);
        }

        public static DateTime? GetSafeNullableDateTime(this IDataReader dataReader, int i, DateTime? dbNullDefault = null)
        {
            if (dataReader == null)
            {
                throw new ArgumentNullException("dataReader");
            }

            if (dataReader.IsDBNull(i))
            {
                return dbNullDefault;
            }

            return new DateTime?(dataReader.GetDateTime(i));
        }

        public static decimal GetSafeDecimal(this IDataReader dataReader, int i, decimal dbNullDefault = default(decimal))
        {
            if (dataReader == null)
            {
                throw new ArgumentNullException("dataReader");
            }

            if (dataReader.IsDBNull(i))
            {
                return dbNullDefault;
            }

            return dataReader.GetDecimal(i);
        }

        public static decimal? GetSafeNullableDecimal(this IDataReader dataReader, int i, decimal? dbNullDefault = null)
        {
            if (dataReader == null)
            {
                throw new ArgumentNullException("dataReader");
            }

            if (dataReader.IsDBNull(i))
            {
                return dbNullDefault;
            }

            return new decimal?(dataReader.GetDecimal(i));
        }

        public static double GetSafeDouble(this IDataReader dataReader, int i, double dbNullDefault = default(double))
        {
            if (dataReader == null)
            {
                throw new ArgumentNullException("dataReader");
            }

            if (dataReader.IsDBNull(i))
            {
                return dbNullDefault;
            }

            return dataReader.GetDouble(i);
        }

        public static double? GetSafeNullableDouble(this IDataReader dataReader, int i, double? dbNullDefault = null)
        {
            if (dataReader == null)
            {
                throw new ArgumentNullException("dataReader");
            }

            if (dataReader.IsDBNull(i))
            {
                return dbNullDefault;
            }

            return new double?(dataReader.GetDouble(i));
        }

        public static float GetSafeFloat(this IDataReader dataReader, int i, float dbNullDefault = default(float))
        {
            if (dataReader == null)
            {
                throw new ArgumentNullException("dataReader");
            }

            if (dataReader.IsDBNull(i))
            {
                return dbNullDefault;
            }

            return dataReader.GetFloat(i);
        }

        public static float? GetSafeNullableFloat(this IDataReader dataReader, int i, float? dbNullDefault = null)
        {
            if (dataReader == null)
            {
                throw new ArgumentNullException("dataReader");
            }

            if (dataReader.IsDBNull(i))
            {
                return dbNullDefault;
            }

            return new float?(dataReader.GetFloat(i));
        }

        public static Guid GetSafeGuid(this IDataReader dataReader, int i, Guid dbNullDefault = default(Guid))
        {
            if (dataReader == null)
            {
                throw new ArgumentNullException("dataReader");
            }

            if (dataReader.IsDBNull(i))
            {
                return dbNullDefault;
            }

            return dataReader.GetGuid(i);
        }

        public static Guid? GetSafeNullableGuid(this IDataReader dataReader, int i, Guid? dbNullDefault = null)
        {
            if (dataReader == null)
            {
                throw new ArgumentNullException("dataReader");
            }

            if (dataReader.IsDBNull(i))
            {
                return dbNullDefault;
            }

            return new Guid?(dataReader.GetGuid(i));
        }

        public static short GetSafeInt16(this IDataReader dataReader, int i, short dbNullDefault = default(short))
        {
            if (dataReader == null)
            {
                throw new ArgumentNullException("dataReader");
            }

            if (dataReader.IsDBNull(i))
            {
                return dbNullDefault;
            }

            return dataReader.GetInt16(i);
        }

        public static short? GetSafeNullableInt16(this IDataReader dataReader, int i, short? dbNullDefault = null)
        {
            if (dataReader == null)
            {
                throw new ArgumentNullException("dataReader");
            }

            if (dataReader.IsDBNull(i))
            {
                return dbNullDefault;
            }

            return new short?(dataReader.GetInt16(i));
        }

        public static int GetSafeInt32(this IDataReader dataReader, int i, int dbNullDefault = default(int))
        {
            if (dataReader == null)
            {
                throw new ArgumentNullException("dataReader");
            }

            if (dataReader.IsDBNull(i))
            {
                return dbNullDefault;
            }

            return dataReader.GetInt32(i);
        }

        public static int? GetSafeNullableInt32(this IDataReader dataReader, int i, int? dbNullDefault = null)
        {
            if (dataReader == null)
            {
                throw new ArgumentNullException("dataReader");
            }

            if (dataReader.IsDBNull(i))
            {
                return dbNullDefault;
            }

            return new int?(dataReader.GetInt32(i));
        }

        public static long GetSafeInt64(this IDataReader dataReader, int i, long dbNullDefault = default(long))
        {
            if (dataReader == null)
            {
                throw new ArgumentNullException("dataReader");
            }

            if (dataReader.IsDBNull(i))
            {
                return dbNullDefault;
            }

            return dataReader.GetInt64(i);
        }

        public static long? GetSafeNullableInt64(this IDataReader dataReader, int i, long? dbNullDefault = null)
        {
            if (dataReader == null)
            {
                throw new ArgumentNullException("dataReader");
            }

            if (dataReader.IsDBNull(i))
            {
                return dbNullDefault;
            }

            return new long?(dataReader.GetInt64(i));
        }

        public static string GetSafeString(this IDataReader dataReader, int i, string dbNullDefault = default(string))
        {
            if (dataReader == null)
            {
                throw new ArgumentNullException("dataReader");
            }

            if (dataReader.IsDBNull(i))
            {
                return dbNullDefault;
            }

            return dataReader.GetString(i);
        }

        //// public object GetValue

        //// public int GetValues
    }
}